package com.seezoon.infrastructure.tcp.handler;

import com.seezoon.infrastructure.tcp.common.RpcContext;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 消息处理器
 *
 * @param <T> request
 * @param <R> response
 */
public interface MessageHandler<T, R> {

    /**
     * 请求类型
     *
     * @return
     */
    int requestType();

    /**
     * 应答类型
     *
     * @return
     */
    int responseType();

    R execute(T request, RpcContext rpcContext);

    default Class<T> getRequestType() {
        final Type[] actualTypeArguments = ((ParameterizedType) getClass().getGenericInterfaces()[0])
                .getActualTypeArguments();
        return (Class<T>) actualTypeArguments[0];
    }

    default Class<T> getResponseType() {
        final Type[] actualTypeArguments = ((ParameterizedType) getClass().getGenericInterfaces()[0])
                .getActualTypeArguments();
        return (Class<T>) actualTypeArguments[1];
    }
}
